package HuaWeiOd.AA;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 
 * 题目描述：
 *
 * 给出一个整数数组，找出出现频率最多的数字，输出该数字在数组中最后一个下标与第一个下标之差，如果有多个频率最高数字，输出最小下标之差。
 *
 * 测试用例:
 *
 * [1, 2, 2, 3, 3, 4, 3, 1, 1]，频率最高的有数字 1 和 3 ，但是 3 构成的数组 [3, 3, 4, 3] 长度 （ 4 ）最小，所以输出 4 。
 * @author caihe
 * @date 2023/4/10 9:41
 */
public class 最小坐标差 {

    public static void main(String[] args) {
        int[] nums = {1, 2, 2, 3, 3, 4, 3, 1, 1};

        System.out.println(minPos(nums));
    }

    /**
     * 使用hashmap计算每个数字出现的次数
     * 
     * @param nums
     * @return
     */
    public static int minPos(int[] nums) {
        List<Integer> numList = Arrays.stream(nums).boxed().collect(Collectors.toList());
        Map<Integer, Integer> map = new HashMap<>();
        for (Integer num : numList) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        // int[]转List
        Integer maxValue = map.values().stream().max(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        }).get();

        List<Integer> resultKey = new ArrayList<>();
        
        for (Integer key : map.keySet()) {
            Integer value = map.get(key);
            if (value.equals( maxValue)) {
                resultKey.add(key);
            }
        }
        int minPos = Integer.MAX_VALUE;

        for (Integer key : resultKey) {
            minPos = Math.min(numList.lastIndexOf(key) - numList.indexOf(key) , minPos);
        }
        return minPos;
    }
    
}
